#pragma once
#include <vector>
#include <Eigen/Sparse>

class CMathFunctions
{
public:
	static Eigen::Vector3f translatePostion(Eigen::Vector3f vParticlePos, Eigen::Matrix4f vTransferMatrix);

	static void polarDecompositionStable(Eigen::Matrix3d& M, double tolerance, Eigen::Matrix3d& R);

	static double oneNorm(Eigen::Matrix3d& A);

	static double infNorm(Eigen::Matrix3d& A);

	static void semiImplicitEuler(double h, double mass, Eigen::Vector3d& position, Eigen::Vector3d& velocity, const Eigen::Vector3d& acceleration);

	static void velocityUpdateFirstOrder(double h, double mass, const Eigen::Vector3d& position, const Eigen::Vector3d& oldPosition, Eigen::Vector3d& velocity);

	static void velocityDamping(double dampFactor, Eigen::Vector3d& velocity);
};